package com.li.onjava8.concurrent.cf.construct;

/**
 * 另一种方法是将构造器设为私有（因此可以防止继承），并提供一个静态Factory方法来生成新对象
 * 通过同步静态工厂方法，可以在构造过程中锁定 Class 对象。
 */
final class SyncFactory implements HasId {
    private final int id;

    private SyncFactory(SharedArg sa) {
        this.id = sa.get();
    }

    @Override
    public int getID() {
        return id;
    }

    public static synchronized SyncFactory factory(SharedArg sa) {
        return new SyncFactory(sa);
    }
}

public class SynchronizedFactory {

    public static void main(String[] args) {
        Unsafe unsafe = new Unsafe();
        IDChecker.test(() -> SyncFactory.factory(unsafe));
    }
}
